package com.photo.photePro.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.masiyi.github.template.GithubTemplate;
import com.photo.photePro.common.R;
import com.photo.photePro.entity.Photo;
import com.photo.photePro.service.PhotoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.UUID;

/**
 * 摄影作品Controller
 */
@Slf4j
@RestController
@RequestMapping("/photos")
public class PhotoController {

    @Autowired
    private PhotoService photoService;

    @Autowired
   private GithubTemplate githubTemplate;


    /**
     * 分页查询摄影作品
     */
    @GetMapping("/page")
    public R<Page<Photo>> page(int page, int pageSize, Integer status,String title,String type) {
        Page<Photo> pageInfo = new Page<>(page, pageSize);
        LambdaQueryWrapper<Photo> queryWrapper = new LambdaQueryWrapper<>();


        // 根据类型筛选  状态：0-待审核 1-已上线 2-已下线',
        if (status != null) {
            queryWrapper.eq(Photo::getStatus, status);
        }
        if (title != null){
            queryWrapper.like(Photo::getTitle, title);
        }
        
        // 状态为已上线的 '类型：1-手机摄影 2-相机摄影'
        if (type != null){
            queryWrapper.eq(Photo::getType, type);
        }

        
        // 按创建时间降序排序
        queryWrapper.orderByDesc(Photo::getCreateTime);
        
        photoService.page(pageInfo, queryWrapper);
        return R.success(pageInfo);
    }

    /**
     * 获取摄影作品详情
     */
    @GetMapping("/{id}")
    public R<Photo> getById(@PathVariable Long id) {
        Photo photo = photoService.getById(id);
        if (photo != null) {
            // 增加浏览量
            photo.setViewCount(photo.getViewCount() + 1);
            photoService.updateById(photo);
            return R.success(photo);
        }
        return R.error("作品不存在");
    }

    /**
     * 上传图片文件
     */
    @PostMapping("/upload")
    public R<String> uploadFile(@RequestParam("file") MultipartFile file) {
        if (file == null || file.isEmpty()) {
            return R.error("请上传图片");
        }

        try {
            // 获取项目根目录的绝对路径
            String projectPath = System.getProperty("user.dir");
            // 文件存储路径
            String uploadPath = projectPath + "/upload/";
            File dir = new File(uploadPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            
            // 文件名
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String fileName = UUID.randomUUID() + suffix;
            String fullPath = uploadPath + fileName;
            
            // 保存文件
            UUID uuid = UUID.randomUUID();
            String imgUrl = githubTemplate.putObject(file.getInputStream(), "提交", file.getOriginalFilename()+ uuid.toString());
            file.transferTo(new File(fullPath));
            log.info("文件上传成功：{}", fullPath);
            
            // 返回图片URL (相对路径，用于前端访问)
            return R.success(imgUrl);
        } catch (IOException e) {
            log.error("上传图片失败：", e);
            return R.error("上传失败：" + e.getMessage());
        }
    }
    
    /**
     * 上传摄影作品
     */
    @PostMapping
    public R<String> save(@RequestBody Photo photo) {
        if (photo.getImgUrl() == null || photo.getImgUrl().isEmpty()) {
            return R.error("图片URL不能为空");
        }
        
        // 保存作品信息
        photo.setStatus(photo.getStatus() != null ? photo.getStatus() : 0); // 默认待审核
        photo.setCreateTime(LocalDateTime.now());
        photo.setUpdateTime(LocalDateTime.now());
        photo.setVoteCount(0);
        photo.setViewCount(0);
        photo.setScore(0.0);
        photo.setStatus(1);
        
        // 使用传入的userId，如果不存在，返回错误
        if (photo.getUserId() == null) {
            return R.error("用户ID不能为空");
        }
        
        // 生成一个基于用户ID的注册编号，而不是纯随机的UUID
        String registrationNumber = generateRegistrationNumber(photo.getUserId());
        photo.setRegistrationNumber(registrationNumber);
        
        photoService.save(photo);
        
        return R.success("添加成功");
    }
    
    /**
     * 生成注册编号
     * 格式: PH + 用户ID + 当前时间戳后6位
     */
    private String generateRegistrationNumber(Long userId) {
        long timestamp = System.currentTimeMillis();
        String timestampStr = String.valueOf(timestamp);
        String lastSixDigits = timestampStr.substring(Math.max(0, timestampStr.length() - 6));
        
        return "PH" + userId + lastSixDigits;
    }

    /**
     * 管理员审核作品
     */
    @PutMapping("/status")
    public R<String> updateStatus(@RequestBody Photo photo) {
        if (photo.getId() == null || photo.getStatus() == null) {
            return R.error("参数错误");
        }
        
        Photo existingPhoto = photoService.getById(photo.getId());
        if (existingPhoto == null) {
            return R.error("作品不存在");
        }
        
        existingPhoto.setStatus(photo.getStatus());
        existingPhoto.setUpdateTime(LocalDateTime.now());
        photoService.updateById(existingPhoto);
        
        return R.success("更新成功");
    }

    /**
     * 根据用户ID分页查询摄影作品
     */
    @GetMapping("/user")
    public R<Page<Photo>> pageByUserId(int page, int pageSize, Long userId) {
        log.info("根据用户ID分页查询摄影作品，page={}, pageSize={}, userId={}", page, pageSize, userId);
        
        if (userId == null) {
            return R.error("用户ID不能为空");
        }
        
        Page<Photo> pageInfo = new Page<>(page, pageSize);
        LambdaQueryWrapper<Photo> queryWrapper = new LambdaQueryWrapper<>();
        
        // 根据用户ID筛选
        queryWrapper.eq(Photo::getUserId, userId);
        
        // 按创建时间降序排序
        queryWrapper.orderByDesc(Photo::getCreateTime);
        
        photoService.page(pageInfo, queryWrapper);
        return R.success(pageInfo);
    }

    /**
     * 删除作品
     */
    @DeleteMapping("/{id}")
    public R<String> delete(@PathVariable Long id) {
        photoService.removeById(id);
        return R.success("删除成功");
    }
} 